iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
自我挑戰組

30天初探tensorflow之旅系列 第 21

Day 21 反向傳播演算法

  • 分享至 

  • xImage
  •  

我們直接來產生 MNIST CNN 模型特徵圖,使用 Keras 和 Matplotlib 來構建模型。

import numpy as np
import matplotlib.pyplot as plt
from keras.models import Model
from keras.layers import Conv2D, Flatten, Dense, Input
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = np.expand_dims(x_train, -1) / 255.0
x_test = np.expand_dims(x_test, -1) / 255.0
x_train = np.repeat(x_train, 3, axis=-1)
x_test = np.repeat(x_test, 3, axis=-1)

input_shape = (28, 28, 3)
inputs = Input(shape=input_shape)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = Flatten()(x)
outputs = Dense(10, activation='softmax')(x)
model = Model(inputs, outputs)
feature_model = Model(inputs=inputs, outputs=model.layers[1].output)
sample = np.expand_dims(x_test[0], axis=0)

feature_map = feature_model.predict(sample)
def plot_feature_maps(feature_maps):
    num_filters = feature_maps.shape[-1]
    plt.figure(figsize=(15, 15))
    for i in range(num_filters):
        plt.subplot(8, 8, i + 1)
        plt.imshow(feature_maps[0, :, :, i], cmap='viridis')
        plt.axis('off')
    plt.tight_layout()
    plt.show()
plot_feature_maps(feature_map)

feature_model.predict 用來獲取特徵圖,以下這張圖為輸出結果,特別注意它是未經訓練前的圖:
https://ithelp.ithome.com.tw/upload/images/20241005/201693301G1wXWUPBm.png
要訓練模型只需要加上這兩行程式碼:

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5, verbose=1)

就會得到:
https://ithelp.ithome.com.tw/upload/images/20241005/20169330HNTEDimSFh.png

要對比訓練模型前後差異,我們需要先了解什麼是反向傳播演算法。
反向傳播(Backpropagation)是一種用於訓練人工神經網路的算法,主要用來計算網絡中每一層的梯度,從而更新權重以最小化損失函數。以下是反向傳播的基本步驟:

  1. 前向傳播(Forward Propagation)
    輸入數據通過網路,計算每一層的激活值,最終得到輸出層的預測結果。這包含計算每一層的加權輸出和應用激活函數。
  2. 計算損失(Loss Calculation)
    根據網路的預測輸出和實際標籤計算損失。
  3. 反向傳播(Backward Propagation)
    在這個步驟會從輸出層開始,根據鏈式法則計算每一層的梯度,計算輸出層的誤差及每一層的梯度,利用誤差和激活導數計算該層的權重和偏置的梯度。
  4. 更新權重(Weight Update)
    使用計算出的梯度來更新權重,常用的更新方法有隨機梯度下降(SGD)及其變體,如 Adam 優化器。

以下附上每一步驟的數學公式:
假設有一個簡單的神經網路:

  • 每層的輸出為 a(激活值)
  • 權重為 w
  • 偏置為 b
  1. 前向傳播:
    https://ithelp.ithome.com.tw/upload/images/20241005/20169330OiTkvXMYrh.png
    註: 𝜎 是激活函數。
    2.損失計算:
    https://ithelp.ithome.com.tw/upload/images/20241005/20169330AZa9WRmleB.png
    註: 第一個y是實際標籤,第二個是預測值。
    3.反向傳播:
    (1)輸出層的誤差:
    https://ithelp.ithome.com.tw/upload/images/20241005/20169330nNCjleDGwE.png
    (2)隱藏層:
    https://ithelp.ithome.com.tw/upload/images/20241005/20169330JrS2UE7Pwq.png
    4.更新權重:
    https://ithelp.ithome.com.tw/upload/images/20241005/20169330QvJw4HyG3T.png
    註: 𝜂 是學習率。

上一篇
Day 20 認識與安裝Keras
下一篇
Day 22 如何儲存和讀取模型
系列文
30天初探tensorflow之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言